#include "bsp_seg_595.h" 
#include "systick.h"
#include "stm32f10x.h"
#include "bsp_buzzer.h"
#include "bsp_led.h"


uint8_t SEG_Code[]={
	0x6f,
  0x05,
  0x76,
  0x57,
  0x1d,
  0x5b,
  0x7b,
	0x07,
  0x7f,
  0x5f,
  0x3f,
  0x79,
  0x6a,
  0x75,
  0x7a,
  0x3a
	
};

// 将简单可显示的字符映射到 SEG_Code(0x00~0x0F 为 hex 0~F)。
// 对于超过 0x0F 的字符，函数会返回 0x00（灭）作为默认。
static uint8_t GetCharIndex(char ch)
{
	// 数字 '0'..'9'
	if(ch>='0' && ch<='9'){
		return (uint8_t)(ch - '0');
	}
	// 大小写十六进制字母 A-F / a-f
	if((ch>='A' && ch<='F')){
		return (uint8_t)(10 + (ch - 'A'));
	}
	if((ch>='a' && ch<='f')){
		return (uint8_t)(10 + (ch - 'a'));
	}

	// 若需要支持更多字母或符号，可在此扩展映射表。
	// 目前对无法映射的字符返回 0xFF（表示无效）。
	return 0xFF;
}

// 将字符直接发送到 595（内部完成字符->段码映射）
void SendChar_595(char ch)
{
	uint8_t idx = GetCharIndex(ch);
	if(idx != 0xFF)
	{
		SendOneChar_595(SEG_Code[idx]);
	}
	else
	{
		// 无效字符：显示空（关灯），并触发声光报警提示（非阻塞）
		SendOneChar_595(0x00);
	// 发起一次非阻塞蜂鸣脉冲（持续约200ms）——需在主循环中反复调用以维护计时
	  BUZZER_OutputDuty(50,500);
		// 让某个 LED 以 2Hz 闪烁作为视觉报警（需主循环中继续调用以保持闪烁）
		// 选择 led_num=0 (蓝色)；频率2Hz。
		LED_Task_2(0, 2);
	}
}

void SEG_595_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;                /*??GPIO_InitStructure?????*/
	  RCC_APB2PeriphClockCmd( DS_595_GPIO_CLK | STCP_595_GPIO_CLK | SHCP_595_GPIO_CLK , ENABLE);  /*???????LED_BLU???GPIO????*/
	  GPIO_InitStructure.GPIO_Pin = DS_595_GPIO_PIN | STCP_595_GPIO_PIN | SHCP_595_GPIO_PIN ;     /*??????LED_BLU_GPIO_PIN??*/
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    /*???????????*/
	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   /*???????50Mhz*/
	  GPIO_Init(DS_595_GPIO_PORT, &GPIO_InitStructure);  /*?????,???GPIO*/
 
     
}

void SendOneChar_595(uint8_t nchar)
{
	uint8_t i=0,mask=0x80;
	
	for(i=0;i<8;i++)
	{
	if((nchar&mask)==0)DS_595_L();
	else DS_595_H();
	
	SHCP_595_L();
	SHCP_595_H();
	mask=(mask>>1);
	}
	STCP_595_L();
	STCP_595_H();
}
